/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.locacao.presenter;

//import br.com.webhomesites.Locacao.contracts.IDevolucaoPresenter;
import br.com.webhomesites.locacao.model.*;
import br.com.webhomesites.locacao.presenter.DevolucaoPresenterActionListeners.BuscarLocacaoActionListener;
import br.com.webhomesites.locacao.presenter.DevolucaoPresenterActionListeners.DevParcComPagActionListener;
import br.com.webhomesites.locacao.presenter.DevolucaoPresenterActionListeners.DevParcSemPagActionListener;
import br.com.webhomesites.locacao.presenter.DevolucaoPresenterActionListeners.DevTotComPagActionListener;
import br.com.webhomesites.locacao.presenter.DevolucaoPresenterActionListeners.DevTotComPagDepoisActionListener;
import br.com.webhomesites.locacao.presenter.DevolucaoPresenterActionListeners.DevTotComPagERenovActionListener;
import br.com.webhomesites.locacao.view.*;
import br.com.webhomesites.padrao.model.ClienteDAO;
import br.com.webhomesites.padrao.model.ClienteModel;
import br.com.webhomesites.padrao.utils.ManipuladorDatas;
import br.com.webhomesites.padrao.utils.PintarTabela;
import br.com.webhomesites.padrao.utils.Strategy;
import java.awt.Color;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableCellRenderer;

/**
 *
 * @author Webhome
 */
public class DevolucaoPresenter {

    private DevolucaoModel devolucaoModel;
    private DevolucaoDAO devolucaoDAO;
    private DevolucaoView devolucaoView;
    private DevolucaoBO devolucaoBO;
    private LocacaoModel locacaoModel;
    private RenovacaoLocacaoModel renovacaoLocacaoModel;
    private RenovacaoLocacaoDAO renovacaoLocacaoDAO;
    private ItemLocacaoModel itemLocacaoModel;
    private ItemLocacaoDAO itemLocacaoDAO;
    private LocacaoDAO locacaoDAO;
    private BuscaLocacaoModel buscaLocacaoModel;
    private ClienteDAO clienteDAO;
    private LocacaoBO locacaoBO;
    private ClienteModel clienteModel;
    List<ItemLocacaoModel> listaItens = new ArrayList<>();
    public final Strategy DEVTOTCOMPAG_STRATEGY = new DevTotComPagStrategy();
    public final Strategy DEVTOTCOMPAGERENOV_STRATEGY = new DevTotComPagERenovStrategy();
    public final Strategy DEVTOTCOMPAGDEPOIS_STRATEGY = new DevTotComPagDepoisStrategy();
    public final Strategy DEVPARCCOMPAG_STRATEGY = new DevParcComPagStrategy();
    public final Strategy DEVPARCSEMPAG_STRATEGY = new DevParcSemPagStrategy();
    public final Strategy BUSCAR_STRATEGY = new BuscarStrategy();
    private Strategy operacao = BUSCAR_STRATEGY;
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

    public DevolucaoPresenter(DevolucaoModel devolucaoModel, DevolucaoDAO devolucaoDAO, DevolucaoView devolucaoView, ItemLocacaoModel itemLocacaoModel, LocacaoDAO locacaoDAO, ItemLocacaoDAO itemLocacaoDAO, ClienteModel clienteModel, BuscaLocacaoModel buscaLocacaoModel, LocacaoModel locacaoModel, ClienteDAO clienteDAO, RenovacaoLocacaoModel renovacaoLocacaoModel, RenovacaoLocacaoDAO renovacaoLocacaoDAO) {
        this.devolucaoModel = devolucaoModel;
        this.devolucaoDAO = devolucaoDAO;
        this.devolucaoView = devolucaoView;
        this.locacaoDAO = locacaoDAO;
        this.locacaoModel = locacaoModel;

        this.itemLocacaoModel = itemLocacaoModel;
        this.itemLocacaoDAO = itemLocacaoDAO;
        this.clienteModel = clienteModel;
        this.buscaLocacaoModel = buscaLocacaoModel;
        this.clienteDAO = clienteDAO;
        this.renovacaoLocacaoModel = renovacaoLocacaoModel;
        this.renovacaoLocacaoDAO = renovacaoLocacaoDAO;
        locacaoBO = new LocacaoBO();
    }

    public void setUpViewListeners() {
        //locacaoView.setInserirActionListener(new InserirActionListener(this));  
        devolucaoView.setDevTotComPagActionListener(new DevTotComPagActionListener(this));
        devolucaoView.setDevTotComPagERenovActionListener(new DevTotComPagERenovActionListener(this));
        devolucaoView.setDevTotComPagDepoisActionListener(new DevTotComPagDepoisActionListener(this));
        devolucaoView.setDevParcComPagActionListener(new DevParcComPagActionListener(this));
        devolucaoView.setDevParcSemPagActionListener(new DevParcSemPagActionListener(this));
        devolucaoView.setBuscarLocacaoActionListener(new BuscarLocacaoActionListener(this));
        devolucaoView.setTableLocacaoMouseListener(new DevolucaoPresenterActionListeners.TableLocacoesMouseListener(this));
        devolucaoView.setTableItensLocacaoMouseListener(new DevolucaoPresenterActionListeners.TableItensLocacaoMouseListener(this));

        //devolucaoView.setMascaraListener(new CampoKeyListener(this));
        //devolucaoView.setDiasDevolucaoEnterListener(new EnterListener(this));

    }

    public void updateModelDevolucaoFromView() {
        try {

            devolucaoModel.setCodigoLocacao(devolucaoView.getCodigoLocacao());
            devolucaoModel.setCodigoCliente(devolucaoView.getCodigoCliente());
            devolucaoModel.setTabelaPrecoLocacao(devolucaoView.getTabelaPreco());
            devolucaoModel.setDiasLocacao(devolucaoView.getDiasLocacao());
            devolucaoModel.setDataDevolucao((Date) formatter.parse(devolucaoView.getDataDevolucao()));
            devolucaoModel.setDataPrevistaDevolucao((Date) formatter.parse(devolucaoView.getDataPrevDevolucao()));
            devolucaoModel.setDataLocacao((Date) formatter.parse(devolucaoView.getDataLocacao()));
            devolucaoModel.setStatucLocacao(devolucaoView.getStatusLocacao());
        } catch (Exception e) {
        }

        System.out.println("******Listagem da Locação Inserida = " + "\n");
        System.out.println("Codigo da Locação = " + devolucaoModel.getCodigoDevolucao() + "\n"
                + "Código do Cliente = " + devolucaoModel.getCodigoCliente() + "\n"
                + "Tabela de preço = " + devolucaoModel.getTabelaPrecoLocacao() + "\n"
                + "Dias Locação = " + devolucaoModel.getDiasLocacao() + "\n");

    }

    public void updateViewDevolucaoFromModel() {
        if (devolucaoModel != null) {

            devolucaoView.setCodigoLocacao(devolucaoModel.getCodigoLocacao());
            devolucaoView.setNomeCliente(devolucaoModel.getNomeCliente());
            devolucaoView.setTabelaPreco(devolucaoModel.getTabelaPrecoLocacao());
            devolucaoView.setDataLocacao(devolucaoModel.getDataLocacao().toString());
            devolucaoView.setDataPrevDevolucao(devolucaoModel.getDataPrevistaDevolucao().toString());
            devolucaoView.setDataDevolucao(devolucaoModel.getDataDevolucao().toString());
            devolucaoView.setDiasLocacao(devolucaoModel.getDiasLocacao());

            switch (devolucaoModel.getStatucLocacao()) {
                case "A":
                    if (ManipuladorDatas.getDataAtual().after(locacaoModel.getDataPrevDevolucao())) {
                        devolucaoView.setStatusLocacao("ATRASADA");
                        devolucaoView.setEstadoBackgroundColor(Color.red);
                    } else {
                        devolucaoView.setStatusLocacao("ABERTA");
                        devolucaoView.setEstadoBackgroundColor(Color.yellow);
                    }
                    break;
                case "R":
                    devolucaoView.setStatusLocacao("RENOVADA");
                    devolucaoView.setEstadoBackgroundColor(Color.blue);
                    devolucaoView.setDataRenovacao(formatter.format(locacaoModel.getDataPagamento()));
                    break;
                case "D":
                    devolucaoModel.getStatucLocacao().equals("DEVOLVIDA");
                    devolucaoView.setEstadoBackgroundColor(Color.green);
                    break;
            }

        } else {
            devolucaoView.clearFields();
        }
    }

    public void updateModelItemLocacaoFromJTable() {
        ItensLocacaoTableModel itensLocacaoTableModel = devolucaoView.getitensLocacaoTableModel();

        itemLocacaoModel = itensLocacaoTableModel.getItemLocacaoModel(devolucaoView.linhaSelecionadaTableItens());

        if (itemLocacaoModel != null) {
            //this.updateViewItemFromModel();  
            //devolucaoView.enableBtn(true);  
        } else {
            //view.enableBtnAlterar(false);  
            //locacaoView.enableBtnRemoverItem(false);  
        }

        //this.updateViewItemFromModel();  
    }

    public void novoDevolucao() {
        //devolucaoModel = new DevolucaoModel();
        //devolucaoView.setItensLocacaoTableModel(new ItensLocacaoTableModel(itemDevolucaoDAO.selecionarTodosItens(devolucaoModel.getCodigoDevolucao())));
    }

    public void habilitarEdicao(boolean arg) {
//        locacaoView.enableTxtDevolucaoCodigo(arg);  
//        locacaoView.enableTxtDevolucaoRazaoSocial(arg); 
//        locacaoView.enableTxtDevolucaoCnpj(arg); 
//        locacaoView.enableTxtDevolucaoInscriacaoEstadual(arg);  
//        locacaoView.enableTxtDevolucaoEndereco(arg);
//        locacaoView.enableTxtDevolucaoBairro(arg);
//        locacaoView.enableTxtDevolucaoCidade(arg);
//        locacaoView.enableTxtDevolucaoEstado(arg);
//        locacaoView.enableTxtDevolucaoTelefone(arg);
//        locacaoView.enableTxtDevolucaoEmail(arg);
//        
//        locacaoView.enableBtnCancelar(arg);
//        locacaoView.enableBtnRemover(arg);
//        locacaoView.enableBtnSalvar(arg);        
    }

    public DevolucaoView getDevolucaoView() {
        return devolucaoView;
    }

    public DevolucaoModel getDevolucaoModel() {
        return devolucaoModel;
    }

    public void setDevolucaoView(DevolucaoView locacaoView) {
        this.devolucaoView = locacaoView;
    }

    public void setDevolucaoModel(DevolucaoModel model) {
        this.devolucaoModel = model;
    }

    public DevolucaoBO getDevolucaoBO() {
        return devolucaoBO;
    }

    public void setDevolucaoBO(DevolucaoBO devolucaoBO) {
        this.devolucaoBO = devolucaoBO;
    }

    public void createView() {
        this.novoDevolucao();
        this.setUpViewListeners();
        DefaultTableCellRenderer dtcr = new PintarTabela();
        devolucaoView.setTableRender(dtcr);
        devolucaoView.packAndShow();
        devolucaoView.setListaClienteBusca(clienteDAO.findAll());
        devolucaoView.setLocacaoTableModel(new LocacaoTableModel(null));
        devolucaoView.setItensLocacaoTableModel(new ItensLocacaoTableModel(null));

    }

    public void setOperacao(Strategy operacao) {
        this.operacao = operacao;
    }

    public Strategy getOperacao() {
        return operacao;
    }

    public void updateViewFromJTableLocacao() {
        LocacaoTableModel locacaoTableModel = devolucaoView.getLocacaoTableModel();

        locacaoModel = locacaoTableModel.getLocacaoModel(devolucaoView.linhaSelecionadaTableLocacao());

        if (locacaoModel != null) {

            this.updateViewFromLocacaoModel();
            this.devolucaoView.setItensLocacaoTableModel(new ItensLocacaoTableModel(itemLocacaoDAO.findByIdLocacao(locacaoModel.getId())));
            this.devolucaoView.setListaTabelaPreco(locacaoDAO.getTabela());
            this.devolucaoView.setTabelaPreco(locacaoModel.getTabelaPreco());
            this.devolucaoView.setListaCliente(clienteDAO.findAll());
            this.devolucaoView.setNomeCliente(locacaoModel.getNomeCliente());

            switch (locacaoModel.getStatus()) {
                case "A":

                    if (locacaoModel.getRenovacao().equals("S")) {
                        if (ManipuladorDatas.getDataAtual().after(locacaoModel.getDataPrevDevolucao())) {
                            devolucaoView.setStatusLocacao("RENOVADA/ATRASADA");
                            devolucaoView.setEstadoBackgroundColor(Color.red);
                        } else {
                            devolucaoView.setStatusLocacao("RENOVADA/ABERTA");
                            devolucaoView.setEstadoBackgroundColor(Color.yellow);
                        }
                    } else {
                        if (ManipuladorDatas.getDataAtual().after(locacaoModel.getDataPrevDevolucao())) {
                            devolucaoView.setStatusLocacao("ATRASADA");
                            devolucaoView.setEstadoBackgroundColor(Color.red);
                        } else {
                            devolucaoView.setStatusLocacao("ABERTA");
                            devolucaoView.setEstadoBackgroundColor(Color.yellow);
                        }
                    }
                    break;
                case "D":
                    if (locacaoModel.getRenovacao().equals("S")) {
                        devolucaoView.setStatusLocacao("RENOVADA/DEVOLVIDA TOTALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.green);
                    } else {
                        devolucaoView.setStatusLocacao("DEVOLVIDA TOTALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.green);
                    }
                    break;
                case "P":
                    if (locacaoModel.getRenovacao().equals("S")) {
                        devolucaoView.setStatusLocacao("RENOVADA/DEVOLVIDA PARCIALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.blue);
                    } else {
                        devolucaoView.setStatusLocacao("DEVOLVIDA PARCIALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.blue);
                    }
                    break;
            }
            
            if(locacaoModel.getRenovacao().equals("S")) {
                updateViewFromRenovacaolocacaoModel();
            }
            
        } else {
            JOptionPane.showMessageDialog(devolucaoView, "Esta locação já foi devolvida!");
            
        }

        //this.updateViewFromLocacaoModel();
    }

    public void updateItemLocacaoFromView() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void updateModelLocacaoFromBuscaView() {
    }

    public void updateModelBuscaLocacaoFromView() {

        try {
            if (!devolucaoView.getCodigoLocacaoBusca().equals("0")) {
                buscaLocacaoModel.setCodigoLocacao(Integer.parseInt(devolucaoView.getCodigoLocacaoBusca()));
            } else if (!devolucaoView.getDataInicialBusca().equals("0")) {
                buscaLocacaoModel.setDataInicial(formatter.parse(devolucaoView.getDataInicialBusca()));
            } else if (!devolucaoView.getDataFinalBusca().equals("0")) {
                buscaLocacaoModel.setDataFinal(formatter.parse(devolucaoView.getDataFinalBusca()));
            }

            buscaLocacaoModel.setCodigoCliente(clienteDAO.getIdByDescricao(devolucaoView.getNomeClienteBusca()));
        } catch (ParseException ex) {
            Logger.getLogger(DevolucaoPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void updateViewFromLocacaoModel() {

        if (locacaoModel != null) {
            System.out.println("Atualizando a view da locação...!");
            devolucaoView.setCodigoLocacao(locacaoModel.getId());
            devolucaoView.setDataLocacao(formatter.format(locacaoModel.getDataLocacao()));
            devolucaoView.setNomeCliente(locacaoModel.getClienteModel().getNome());
            devolucaoView.setTabelaPreco(locacaoBO.apurarTabelaPreco(locacaoModel.getTabelaPreco()));
            devolucaoView.setDiasLocacao(locacaoModel.getDiasLocacao());
            devolucaoView.setDataPrevDevolucao(formatter.format(locacaoModel.getDataPrevDevolucao()));
            devolucaoView.setValorTotalLocacao(locacaoModel.getValorTotalPrevisto());

            switch (locacaoModel.getStatus()) {
                case "A":
                    if (locacaoModel.getRenovacao().equals("S")) {
                        if (ManipuladorDatas.getDataAtual().after(locacaoModel.getDataPrevDevolucao())) {
                            devolucaoView.setStatusLocacao("RENOVADA/ATRASADA");
                            devolucaoView.setEstadoBackgroundColor(Color.red);
                        } else {
                            devolucaoView.setStatusLocacao("RENOVADA/ABERTA");
                            devolucaoView.setEstadoBackgroundColor(Color.yellow);
                        }
                    } else {
                        if (ManipuladorDatas.getDataAtual().after(locacaoModel.getDataPrevDevolucao())) {
                            devolucaoView.setStatusLocacao("ATRASADA");
                            devolucaoView.setEstadoBackgroundColor(Color.red);
                        } else {
                            devolucaoView.setStatusLocacao("ABERTA");
                            devolucaoView.setEstadoBackgroundColor(Color.yellow);
                        }
                    }
                    break;
                case "D":
                    if (locacaoModel.getRenovacao().equals("S")) {
                        devolucaoView.setStatusLocacao("RENOVADA/DEVOLVIDA TOTALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.green);
                    } else {
                        devolucaoView.setStatusLocacao("DEVOLVIDA TOTALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.green);
                    }
                    break;
                case "P":
                    if (locacaoModel.getRenovacao().equals("S")) {
                        devolucaoView.setStatusLocacao("RENOVADA/DEVOLVIDA PARCIALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.blue);
                    } else {
                        devolucaoView.setStatusLocacao("DEVOLVIDA PARCIALMENTE");
                        devolucaoView.setEstadoBackgroundColor(Color.blue);
                    }
                    break;
            }
            //devolucaoView.setDataDevolucao(formatter.format(locacaoModel.getDataDevolucao()));            
        } else {
            devolucaoView.clearFields();
        }
    }

    public void updateViewFromRenovacaolocacaoModel(){
        
        if (locacaoModel != null) {
            
            renovacaoLocacaoModel = renovacaoLocacaoDAO.findLastRenovacaoByIdLocacao(locacaoModel.getId());
            
            devolucaoView.setDataRenovacao(formatter.format(renovacaoLocacaoModel.getDataRenovacao()));
        }
        
    }
    
    
    public void devolverTotComPag() {

        DevolucaoTotComPagView devolucaoTotComPagView = new DevolucaoTotComPagView(javax.swing.JOptionPane.getFrameForComponent(devolucaoView), true);
        DevolucaoTotComPagPresenter devolucaoTotComPagPresenter =
                new DevolucaoTotComPagPresenter(devolucaoTotComPagView, locacaoModel, locacaoDAO);
        devolucaoTotComPagPresenter.createView();
    }

    public void devolverTotComPagERenov() {
        RenovacaoLocacaoModel devolucaoTotComRenovModel = new RenovacaoLocacaoModel();
        //DevolucaoTotComPagView devolucaoTotComPagView = new DevolucaoTotComPagView();
        DevolucaoTotComRenovView devolucaoTotComRenovView = new DevolucaoTotComRenovView(javax.swing.JOptionPane.getFrameForComponent(devolucaoView), true);
        DevolucaoTotComRenovPresenter devolucaoTotComRenovPresenter =
                new DevolucaoTotComRenovPresenter(devolucaoTotComRenovModel, devolucaoTotComRenovView, locacaoModel, locacaoDAO);
        devolucaoTotComRenovPresenter.createView();
    }

    public void devolverParcComPag() {
        ItemDevolucaoParcialModel itemDevolucaoParcialModel = new ItemDevolucaoParcialModel();
        //DevolucaoTotComPagView devolucaoTotComPagView = new DevolucaoTotComPagView();
        DevolucaoParcComPagView devolucaoParcComPagView = new DevolucaoParcComPagView(javax.swing.JOptionPane.getFrameForComponent(devolucaoView), true);
        DevolucaoParcComPagPresenter devolucaoParcComPagPresenter =
                new DevolucaoParcComPagPresenter(itemDevolucaoParcialModel, devolucaoParcComPagView, locacaoModel, locacaoDAO, this);
        devolucaoParcComPagPresenter.createView();
    }

    public void devolverTotComPagDepois() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void devolverParcSemPag() {
        ItemDevolucaoParcialModel itemDevolucaoParcialModel = new ItemDevolucaoParcialModel();
        //DevolucaoTotComPagView devolucaoTotComPagView = new DevolucaoTotComPagView();
        DevolucaoParcSemPagView devolucaoParcSemPagView = new DevolucaoParcSemPagView(javax.swing.JOptionPane.getFrameForComponent(devolucaoView), true);
        DevolucaoParcSemPagPresenter devolucaoParcSemPagPresenter =
                new DevolucaoParcSemPagPresenter(itemDevolucaoParcialModel, devolucaoParcSemPagView, locacaoModel, locacaoDAO, this);
        devolucaoParcSemPagPresenter.createView();
    }

    public void buscarLocacao() {

        this.updateModelBuscaLocacaoFromView();
        if (buscaLocacaoModel.getCodigoLocacao() != 0 && buscaLocacaoModel.getCodigoCliente() != 0) {
            System.out.println("Buscando por locação");
            System.out.println("Código Locacão = " + buscaLocacaoModel.getCodigoLocacao());
            //System.out.println("A Locacao = " + locacaoDAO.getById(buscaLocacaoModel.getCodigoLocacao()).toString());
            //devolucaoView.setLocacaoTableModel(new LocacaoTableModel(locacaoDAO.buscarLocacaoPorPeriodo(buscaLocacaoModel.getDataInicial(), buscaLocacaoModel.getDataFinal())));
            List<LocacaoModel> locacaoUnica = new ArrayList<>();
            locacaoUnica.add(locacaoDAO.getById(buscaLocacaoModel.getCodigoLocacao()));
            devolucaoView.setLocacaoTableModel(new LocacaoTableModel(locacaoUnica));
            devolucaoView.refreshTableLocacao();
        } else if (buscaLocacaoModel.getCodigoLocacao() == 0 && buscaLocacaoModel.getCodigoCliente() != 0) {
            System.out.println("Buscando por cliente");
            System.out.println("O código do cliente para a busca(Já buscando) é = " + buscaLocacaoModel.getCodigoCliente());
            //devolucaoView.setLocacaoTableModel(new LocacaoTableModel(locacaoDAO.fin(buscaLocacaoModel.getCodigoCliente())));

        } else {
            //devolucaoView.setLocacaoTableModel(new LocacaoTableModel(locacaoDAO.selecionarLocacaoPorCodigoCliente(buscaLocacaoModel.getCodigoCliente())));
        }
        //devolucaoView.clearFields();
    }

    public void cancelarbusca() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    private class DevTotComPagStrategy implements Strategy {

        @Override
        public void execute() {
            devolverTotComPag();
        }
    }

    private class DevTotComPagERenovStrategy implements Strategy {

        @Override
        public void execute() {
            devolverTotComPagERenov();
        }
    }

    private class DevTotComPagDepoisStrategy implements Strategy {

        @Override
        public void execute() {
            devolverTotComPagDepois();
        }
    }

    private class DevParcComPagStrategy implements Strategy {

        @Override
        public void execute() {
            devolverParcComPag();
        }
    }

    private class DevParcSemPagStrategy implements Strategy {

        @Override
        public void execute() {
            devolverParcSemPag();
        }
    }

    private class BuscarStrategy implements Strategy {

        @Override
        public void execute() {
            buscarLocacao();
        }
    }
}
